/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Manejadores;

import Logica.Accion;
import Logica.Usuario;
import Persistencia.ADOAccion;
import Persistencia.ADOUsuario;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Facundo
 */
public class ManejadorUsuarios {

    ADOUsuario persistenciaUsuario;
    ADOAccion persistenciaAccion;
    LinkedList<Accion> accionesAbiertas;

    public ManejadorUsuarios() {
        persistenciaUsuario = new ADOUsuario();
        persistenciaAccion = new ADOAccion();
    }

    public LinkedList<Accion> getAccionesAbiertas() {
        return accionesAbiertas;
    }

    public void setAccionesAbiertas(LinkedList<Accion> accionesAbiertas) {
        this.accionesAbiertas = accionesAbiertas;
    }

    public boolean grabarUsuario(String nombreUsuario, String rol) {
        //Checkeo si el nombre de usuario ya existe en la base de datos
        if (this.checkearDisponibilidadNombreUsuario(nombreUsuario)) {
            //Creo el objeto Usuario
            Usuario usr = new Usuario(nombreUsuario, rol, true);
            //Se lo paso al objeto de persistencia para que lo grabe en la BD.
            persistenciaUsuario.insertarUsuario(usr);
            return true;
        } else {
            return false;
        }
    }

    public boolean checkearDisponibilidadNombreUsuario(String nombreUsuario) {
        Usuario usr;
        //Traigo todos los usuarios de la BD
        LinkedList lista = persistenciaUsuario.traerSoloUsuarios();
        //Recorro la lista para ver si existe un usuario con el mismo nombreUsuario
        if (!lista.isEmpty()) {
            Iterator it = lista.iterator();
            while (it.hasNext()) {
                usr = (Usuario) it.next();
                if (usr.getNombreUsuario().equals(nombreUsuario)) {
                    //Si existe devuelvo false
                    return false;
                }
            }
        }
        //Si no existe devuelvo true
        return true;
    }

    public DefaultTableModel cargarTablaUsuarios() {
        //Creo el modelo base para la tabla
        DefaultTableModel modeloResultado = new javax.swing.table.DefaultTableModel(
                new Object[][]{},
                new String[]{
                    "Nombre del usuario", "Rol", "Habilitado"
                }) {

            @Override
            public boolean isCellEditable(int fila, int columna) {
                return false; //Con esto conseguimos que la tabla no se pueda editar
            }
        };
        //Traigo la lista de todos los usuarios y le creo un iterador
        LinkedList usuarios = persistenciaUsuario.traerSoloUsuarios();
        Iterator iter = usuarios.iterator();
        //Recorro la lista
        while (iter.hasNext()) {
            //Creo los objetos Usuario
            Usuario u = (Usuario) iter.next();
            String habilitado = "";
            String rol = "";
            //Traduzco los valores a String para mejor comprensión en la tabla
            if (u.isHabilitado()) {
                habilitado = "Habilitado";
            } else {
                habilitado = "No habilitado";
            }
            if (u.getRol().equals("administrador")) {
                rol = "Administrador";
            } else {
                rol = "Usuario";
            }
            //Agrego la fila con los valores del usuario al modelo de tabla
            String[] o = {"" + u.getNombreUsuario(), "" + rol, "" + habilitado};
            modeloResultado.addRow(o);
        }
        //Devuelvo el modelo que va a mostrar todos los usuarios en la tabla
        return modeloResultado;
    }

    public LinkedList<Accion> accionesAbiertas(Usuario u) {
        //Busco y retorno un LinkedList con las acciones abiertas del usuario. Puede estar vacío.
        return persistenciaAccion.traerAccionesAbiertasPorUsuario(u);
    }

    public boolean deshabilitarUsuario(Usuario u) {
        //Deshabilito el usuario
        return persistenciaUsuario.deshabilitarUsuario(u);
    }

    public DefaultTableModel cargarModeloTablaAccionesAbiertas() {
        DefaultTableModel modeloResultado = new javax.swing.table.DefaultTableModel(
                new Object[][]{},
                new String[]{
                    "ID", "Nombre", "Descripcion", "Usuario", "Vencimiento", "Reunion", "Proyecto"}) {

            @Override
            public boolean isCellEditable(int fila, int columna) {
                return false; //Con esto conseguimos que la tabla no se pueda editar
            }
        };
        Iterator iter = this.getAccionesAbiertas().iterator();
        while (iter.hasNext()) {
            Accion a = (Accion) iter.next();
            String[] o = {"" + a.getId(), "" + a.getNombre(), "" + a.getDescripcion(), "" + a.getUsuario().getNombreUsuario(), "" + a.getFechaVencimientoString(), "" + a.getReunion(), "" + a.getProyecto()};
            modeloResultado.addRow(o);
        }
        return modeloResultado;
    }

    public DefaultTableModel actualizarModeloTablaAccionesAbiertas(int id) {
        LinkedList<Accion> acciones = this.getAccionesAbiertas();
        Iterator it = acciones.iterator();
        while (it.hasNext()) {
            Accion a = (Accion) it.next();
            if (id == a.getId()) {
                it.remove();
            }
        }
        this.setAccionesAbiertas(acciones);
        return cargarModeloTablaAccionesAbiertas();
    }

    public LinkedList cargarComboUsuariosPorProyecto(String proyecto) {
        return persistenciaUsuario.traerUsuariosPorProyectoHabilitados(proyecto);
    }

    public boolean lasAccionesAbiertasSonDeUnProyectoConMasDeUnUsuario(LinkedList accionesAbiertas) {
        LinkedList usuariosPorProyecto;
        Iterator iter = accionesAbiertas.iterator();
        while (iter.hasNext()) {
            Accion a = (Accion) iter.next();
            usuariosPorProyecto = persistenciaUsuario.traerUsuariosPorProyectoHabilitados(a.getProyecto());
            if (usuariosPorProyecto.size() < 2) {
                return false;
            }
        }
        return true;
    }

    public boolean actualizarUsuarioEnAccion(int id, String nombreUsuario) {
        try {
            //Con el objeto ADOAccion llamo al metodo que actualizara el usuario de la accion
            persistenciaAccion.actualizarUsuarioEnAccion(id, nombreUsuario);
        } catch (Exception e) {
            return false;
        }
        return true;
    }
}
